package com.wuchu.shiro.config;

import com.wuchu.shiro.shiro.AccountRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 类描述：Shiro配置类
 * 总共分三步：
 *  1、创建ShiroFilterFactoryBean
 *  2、创建DefaultWebSecurityManager
 *  3、创建AccountRealm
 * Author: WuChu
 * Date: 2022/3/3
 * Version: 1.0
 */
@Configuration
public class ShiroConfig {


    //配置 ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);

        /**
         * 有几种权限：
         *  1、aono: 全部可以访问
         *  2、authc: 认证才可以访问
         *  3、user: 必须拥有‘记住我’功能才可以使用
         *  4、perms: 拥有对某个资源的权限才可以访问
         *  5、role: 拥有某个角色才可以访问
         */
        Map<String, String > filterChainDefinitionMap = new LinkedHashMap<>();

        // shiro已经配置好了logout(注销)
        filterChainDefinitionMap.put("/logout","logout");


        /**
         * 对用户进行设定授权，设置授权后，用户访问该路径，就会去执行AccountRealm中的
         * AuthorizationInfo方法
         * 比如：在数据库中的用户权限表如下
         * admin	12345	user:admin
         * 李四	    12345	user:add
         * 张三	    12345	user:update
         * 给admin规定可以访问add和update
         * 给李四规定只能访问add
         * 给张三规定只能访问update
         */
        filterChainDefinitionMap.put("/toAdd","perms[user:add]");
        filterChainDefinitionMap.put("/user/add","perms[user:add]");
        filterChainDefinitionMap.put("/toUpdate","perms[user:update]");
        filterChainDefinitionMap.put("/user/update/*","perms[user:update]");
        filterChainDefinitionMap.put("/user/delete/*","perms[user:delete]");




        /**
         * 对用户进行认证，设置授权后，用户访问该路径，就会去执行AccountRealm中的
         *  AuthenticationInfo方法
         */
        filterChainDefinitionMap.put("/user/*","authc");



        //没有认证去往登录界面
        shiroFilterFactoryBean.setLoginUrl("/toLogin");
        //认证成功去往主页
        shiroFilterFactoryBean.setSuccessUrl("/index");
        //认证不通过
        shiroFilterFactoryBean.setUnauthorizedUrl("/error");

        //加载规则(filterChainDefinitionMap)
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }






    // 配置 DefaultWebSecurityManager
    @Bean("securityManager")
    public  DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("accountRealm") AccountRealm accountRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(accountRealm);
        return defaultWebSecurityManager;
    }






    // 创建AccountRealm对象(需要自定义类)
    @Bean(name = "accountRealm")
    public AccountRealm accountRealm(){
        return new AccountRealm();
    }


}
